Be more lenient about iteration when lib=es5 / noLib#63070
Merged
jakebailey merged 3 commits intomicrosoft:mainfrom Jan 30, 2026
Merged
Be more lenient about iteration when lib=es5 / noLib#63070jakebailey merged 3 commits intomicrosoft:mainfrom
lib=es5 / noLib#63070jakebailey merged 3 commits intomicrosoft:mainfrom
Conversation
jakebailey
commented
Jan 30, 2026
...s/reference/sourceMapValidationDestructuringForArrayBindingPattern(target=es2015).errors.txt
Show resolved
Hide resolved
jakebailey
commented
Jan 30, 2026
jakebailey
commented
Jan 30, 2026
Contributor
There was a problem hiding this comment.
Pull request overview
Adjusts TypeScript’s iteration type-checking so that when iterator/Iterable types are unavailable (e.g. lib=es5 or noLib) but target is ES2015+, the checker falls back to ES5-style “array/string-only” iteration rules instead of emitting [Symbol.iterator]-missing errors.
Changes:
- Gate “uplevel iteration” semantics on the presence of the global
Iterabletype; otherwise fall back to array/string handling. - Add a compiler test matrix covering
lib=es5vsnoLiband multipletargetvalues forfor..ofiteration. - Update reference baselines to reflect the new iteration behavior (fewer TS2488/TS2504 iterator errors; more ES5-style diagnostics and improved element typing).
Reviewed changes
Copilot reviewed 72 out of 72 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| src/compiler/checker.ts | Changes iteration semantics selection to depend on presence of Iterable (fallback to array/string iteration when missing). |
| tests/cases/compiler/arrayIterationLibES5TargetDifferent.ts | Adds coverage for for..of behavior under lib=es5 / noLib across targets. |
| tests/baselines/reference/useObjectValuesAndEntries1(target=es2015).types | Updates element type inference for for..of when falling back from missing iterator libs. |
| tests/baselines/reference/useObjectValuesAndEntries1(target=es2015).errors.txt | Removes iterator-missing error now that array fallback applies. |
| tests/baselines/reference/types.forAwait.es2018.3.errors.txt | Updates diagnostics emitted for for await..of when async iteration types are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPatternDefaultValues3(target=es2015).types | Baseline updates due to new iteration/destructuring behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPatternDefaultValues3(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPatternDefaultValues2(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPatternDefaultValues(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPattern3(target=es2015).types | Baseline updates due to new iteration/destructuring behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPattern3(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPattern2(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPattern(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPatternDefaultValues2(target=es2015).types | Baseline updates due to new iteration/destructuring behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPatternDefaultValues2(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPatternDefaultValues(target=es2015).types | Baseline updates due to new iteration/destructuring behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPatternDefaultValues(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPattern2(target=es2015).types | Baseline updates due to new iteration/destructuring behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPattern2(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPattern(target=es2015).types | Baseline updates due to new iteration/destructuring behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPattern(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPatternDefaultValues2(target=es2015).types | Baseline updates due to new iteration behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPatternDefaultValues(target=es2015).types | Baseline updates due to new iteration behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPatternDefaultValues(target=es2015).symbols | Baseline symbol changes due to updated binding/typing under fallback iteration. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPatternDefaultValues(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern2(target=es2015).types | Baseline updates due to new iteration behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern2(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern(target=es2015).types | Baseline updates due to new iteration behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern(target=es2015).symbols | Baseline symbol changes due to updated binding/typing under fallback iteration. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPatternDefaultValues2(target=es2015).types | Baseline updates due to new iteration/destructuring behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPatternDefaultValues2(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPatternDefaultValues(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPattern2(target=es2015).types | Baseline updates due to new iteration/destructuring behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPattern2(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPattern(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPatternDefaultValues2(target=es2015).types | Baseline updates due to new iteration/destructuring behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPatternDefaultValues2(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPatternDefaultValues(target=es2015).types | Baseline updates due to new iteration/destructuring behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPatternDefaultValues(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPattern2(target=es2015).types | Baseline updates due to new iteration/destructuring behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPattern2(target=es2015).errors.txt | Removes iterator-missing errors under new fallback behavior. |
| tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPattern(target=es2015).types | Baseline updates due to new iteration/destructuring behavior when iterator libs are missing. |
| tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPattern(target=es2015).errors.txt | Updates diagnostics summary due to fallback iteration (iterator-missing errors removed). |
| tests/baselines/reference/noCrashOnNoLib.errors.txt | Baseline updates for changed diagnostic behavior under noLib. |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=esnext).types | New baseline for test matrix (types). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=esnext).symbols | New baseline for test matrix (symbols). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=esnext).js | New baseline for test matrix (emit). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=esnext).errors.txt | New baseline for test matrix (errors). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es5).types | New baseline for test matrix (types). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es5).symbols | New baseline for test matrix (symbols). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es5).js | New baseline for test matrix (emit). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es5).errors.txt | New baseline for test matrix (errors). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es2015).types | New baseline for test matrix (types). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es2015).symbols | New baseline for test matrix (symbols). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es2015).js | New baseline for test matrix (emit). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es2015).errors.txt | New baseline for test matrix (errors). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=esnext).types | New baseline for test matrix (types). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=esnext).symbols | New baseline for test matrix (symbols). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=esnext).js | New baseline for test matrix (emit). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=esnext).errors.txt | New baseline for test matrix (errors). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es5).types | New baseline for test matrix (types). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es5).symbols | New baseline for test matrix (symbols). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es5).js | New baseline for test matrix (emit). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es5).errors.txt | New baseline for test matrix (errors). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es2015).types | New baseline for test matrix (types). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es2015).symbols | New baseline for test matrix (symbols). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es2015).js | New baseline for test matrix (emit). |
| tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es2015).errors.txt | New baseline for test matrix (errors). |
RyanCavanaugh
approved these changes
Jan 30, 2026
RyanCavanaugh
approved these changes
Jan 30, 2026
RyanCavanaugh
approved these changes
Jan 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
When
lib=es5ornoLib, but thetargetis ES2015+, we issue errors on iterations complaining that[Symbol.iterator]()is missing. Which is impossible, because there's no lib.See these breaks: #63067 (comment)
But, we already know how to handle iteration when target is ES5 and there's no iteration libs; we just say "okay, you can iterate over arrays and strings".
This PR tweaks things so that we more or less fall back to ES5-ish behavior when the iterator types are missing, re-allowing iteration on arrays/strings (when
Arrayexists; innoLib, things are universally weird) but preventing other kinds of iterations.This is not dissimilar to us allowing async/await to work when
Promiselibs are missing.